/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Dao;

import BackEnd.Exceptions.*;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.ResultSet;
import com.mysql.jdbc.Statement;
import java.sql.Date;
import java.sql.SQLException;
import java.sql.Types;

/**
 *
 * @author Ivan
 */
public class UsuarioDao extends DaoBase {

    @Override
    public ValueObjectBase create(ValueObjectBase value) throws CreateRegisterException
    {
        if (value.getClass()==UsuarioValueObject.class)
        {
            UsuarioValueObject vo = (UsuarioValueObject)value;
            try {
                Connection con = super.getConection("dlc");
                String sentencia = "call pa_registrarUsuario(?,?,?,?,?,?,?,?,?)";    
                java.sql.CallableStatement wcall=con.prepareCall(sentencia);
                wcall.setString(1, vo.getNombreUsuario());
                wcall.setString(2, vo.getNombre());
                wcall.setString(3, vo.getApellido());
                wcall.setString(4, vo.getContrasenia());
                wcall.setDate(5,(Date) vo.getFechaNac());
                wcall.setString(6, vo.getSexo());
                wcall.setString(7, vo.getMail());
                wcall.setInt(8, vo.getIdProvincia());
                wcall.setInt(9,vo.getIdPais());
                wcall.setString(10, "@var");
                wcall.setString(11, "@var1");
                wcall.setString(12,"@var2");
                wcall.setString(13, "@var3");
                //se registra los parametros out

                wcall.registerOutParameter(10, Types.INTEGER);
                wcall.registerOutParameter(11, Types.DATE);
                wcall.registerOutParameter(12, Types.INTEGER);
                wcall.registerOutParameter(13, Types.INTEGER);
                wcall.execute();
                vo.setId(wcall.getInt(10));
                vo.setFechaAlta(wcall.getDate(11));
                vo.setIdTipoUsuario(wcall.getInt(12));
                vo.setIdEstadoUsuario(wcall.getInt(13));
                wcall.close();
                vo.setCreado(true);
                vo.setModificado(false);

            } catch (SQLException ex) {
                throw new CreateRegisterException();
            }
            
            
            return vo;
        }
        else
            throw new CreateRegisterException();

    }

    @Override
    public void update(ValueObjectBase value) throws UpdateRegisterException
    {    
         if (value.getClass()==UsuarioValueObject.class)
        {
            UsuarioValueObject vo = (UsuarioValueObject)value;
            try {
                Connection con = super.getConection("dlc");
                String sentencia = "call pa_registrarPerfil(?,?,?,?,?,?,?,?,?)";              
                java.sql.CallableStatement wcall=con.prepareCall(sentencia);
                wcall.setString(1, vo.getNombre());
                wcall.setString(2, vo.getApellido());                
                wcall.setDate(3,(Date) vo.getFechaNac());
                wcall.setString(4, vo.getDescripcion());
                wcall.setInt(5, vo.getIdOcupacion());
                wcall.setString(6, vo.getSexo());
                wcall.setString(7, vo.getTelefono());
                wcall.setInt(8, vo.getId());           
                wcall.setString(9, vo.getMail());                        
                wcall.execute();                                
                wcall.close();
                con.close();
            } catch (SQLException ex) {
                throw new UpdateRegisterException();
            }        
        }
         else
             throw new UpdateRegisterException();
        
            
    }

    @Override
    public ValueObjectBase retrive(PkBase pk)
    {
        
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void delete(PkBase pk) throws DeleteRegisterException
    {
        if(pk.getClass()==PkId.class)
        {
            PkId id=(PkId)pk;
            try {
                java.util.Date d = new java.util.Date();
                Connection con = super.getConection("dlc");
                String sentencia = "call pa_bajaUsuario(?,?,?)";
                java.sql.CallableStatement wcall=con.prepareCall(sentencia);
                wcall.setInt(1,id.getId());
                wcall.setDate(2,(Date) d);
                wcall.setString(3, "@var");
                wcall.registerOutParameter(2, Types.INTEGER);
                wcall.execute();
                wcall.close();
                con.close();

            } catch (SQLException ex) {
                throw new DeleteRegisterException();
            }
        }
        else
            throw new DeleteRegisterException();

    }

    @Override
    public ValueObjectBase[] listarTodos() throws NotExistRegisterException {
        return this.mostrarConsulta("select * from usuario");
    }

    @Override
    public ValueObjectBase[] mostrarConsulta(String consulta) throws NotExistRegisterException
    {
        UsuarioValueObject[] vec=null;
            try {
                Connection con = super.getConection("dlc");
                Statement st=(Statement)con.createStatement();
                st.execute(consulta);
                ResultSet res=(ResultSet) st.getResultSet();
                res.last();
                vec = new UsuarioValueObject[res.getRow()];
                res.first();
                vec[0]=this.leerVo(res);
                while(res.next())
                {
                    vec[res.getRow()-1]=this.leerVo(res);
                }
                res.close();
                con.close();

            } catch (SQLException ex) {
                throw new NotExistRegisterException();
            }
        return vec;
        
    }

    @Override
    public ValueObjectBase traer(PkBase pk) throws NotExistRegisterException {
        if(pk.getClass() == PkId.class)
        {
            PkId id=(PkId)pk;
            UsuarioValueObject vo = new UsuarioValueObject();
            try {
                Connection con = super.getConection("dlc");
                String sentencia = "select * from Usuario where id="+id.getId();
                Statement st=(Statement)con.createStatement();
                st.execute(sentencia);
                ResultSet res=(ResultSet) st.getResultSet();                
                res.next();
                vo=this.leerVo(res);
                res.close();
                con.close();

            } catch (SQLException ex) {                
                throw new NotExistRegisterException();
            }

            return vo;
        }
        else
            throw new NotExistRegisterException();
    }
    private UsuarioValueObject leerVo(ResultSet res)
    {
        UsuarioValueObject vo = new UsuarioValueObject();
        try {
                vo.setId(res.getInt("id"));
                vo.setNombre(res.getString("nombre"));
                vo.setApellido(res.getString("apellido"));
                vo.setTelefono(res.getString("telefono"));
                vo.setNombreUsuario(res.getString("nombreUsuario"));
                vo.setContrasenia(res.getString("contrasenia"));
                vo.setIdTipoUsuario(res.getInt("idTipoUsuario"));
                vo.setIdOcupacion(res.getInt("idOcupacion"));
                vo.setDescripcion(res.getString("descripcion"));
                vo.setIdEstadoUsuario(res.getInt("idEstadoUsuario"));
                vo.setIdProvincia(res.getInt("idProvincia"));
                vo.setIdPais(res.getInt("idPais"));
                vo.setFechaNac(res.getDate("fechaNac"));
                vo.setSexo(res.getString("sexo"));
                vo.setMail(res.getString("mail"));
                vo.setFechaAlta(res.getDate("fechaAlta"));

        } catch (SQLException ex) {
            return null;
        }
        return vo;
    }
}
